package com.kanshu.ksgb.fastread.doudou.common.util;

import android.util.Log;

import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;

import org.json.JSONException;
import org.json.JSONObject;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * <pre>
 * json数据解析工具
 * 如果要解析的json数据根元素是一个对象，则使用{@link #json2Bean(String, Class)}
 * 如果要解析的json数据根元素是一个集合，则使用{@link #json2Bean(String, Type)}
 * </pre>
 */
public class JsonUtils {

    /**
     * 用于解析json的类
     */
    private static Gson GSON = new Gson();

    /**
     * 把json字符串转换为JavaBean
     *
     * @param json      json字符串
     * @param beanClass JavaBean的Class
     */
    public static <T> T json2Bean(String json, Class<T> beanClass) {
        T bean = null;
        try {
            bean = GSON.fromJson(json, beanClass);
        } catch (Exception e) {
            Log.i("JsonUtils", "解析json数据时出现异常\njson = " + json, e);
        }
        return bean;
    }

    /**
     * 把json字符串转换为JavaBean。如果json的根节点就是一个集合，则使用此方法<p>
     * type参数的获取方式为：Type type_int = new TypeToken<集合泛型>(){}.getType();
     *
     * @param json json字符串
     * @return type_int 指定要解析成的数据类型
     */
    public static <T> T json2Bean(String json, Type type) {
        T bean = null;
        try {
            bean = GSON.fromJson(json, type);
        } catch (Exception e) {
            Log.i("JsonUtils", "解析json数据时出现异常\njson = " + json, e);
        }
        return bean;
    }

    public static <T> T json2BeanByFastJson(String json, Class<T> beanClass) {
        try {
            return com.alibaba.fastjson.JSONObject.parseObject(json, beanClass);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将json转为数组
     *
     * @param json
     * @param beanClass
     * @param <T>
     * @return
     */
    public static <T> List<T> json2ArrayByFastJson(String json, Class<T> beanClass) {
        try {
            return JSON.parseArray(json, beanClass);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String bean2JsonByFastJson(Object object) {
        try {
            return com.alibaba.fastjson.JSONObject.toJSONString(object);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 将实体bean转化为json字符串
     *
     * @param object
     * @return
     */
    public static String bean2Json(Object object) {
        return GSON.toJson(object);
    }

    /**
     * 把json字符串转化为map结构
     *
     * @param jsonStr
     * @return
     */
    public static Map<String, String> jsonStrToMap(String jsonStr) {
        Map<String, String> map = new HashMap<>();
        try {
            JSONObject jsonObject = new JSONObject(jsonStr);
            Iterator<String> keys = jsonObject.keys();
            while (keys.hasNext()) {
                String key = keys.next();
                map.put(key, jsonObject.get(key).toString());
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return map;
    }

}
